#include <iostream>
#include <cassert>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <cstdio>
#include<sys/wait.h>
using std::cout;
using std::endl;

// #define CONTENT "I am father!"

int main()
{
    int pipefd[2];
    pipe(pipefd);

    // pipe[0]读 pipe[1]写

    int pid = fork();

    // child
    if (pid == 0)
    {
        // 子进程读
        close(pipefd[1]);
        int cnt = 5;
        char buffer[1024] = {0};
        while(cnt--)
        {
            buffer[0]= 0 ;   
            int rret = read(pipefd[0], buffer, sizeof(buffer));
            if(rret == -1)
                perror("read");
            buffer[rret] = '\0'; 
            cout << buffer << endl;
        }
        // while (read(pipefd[0], buffer, sizeof(buffer)) > 0) 
        // { 
        //     // 管道读取数据
        //     cout << buffer<<endl;
        //     sleep(1);
        // }
        close(pipefd[0]);
    }
    //wait(NULL);
    // father

    if(pid>0)
    {
        int cnt = 5;
        close(pipefd[0]);
        
        while (cnt--)
        {
            // 父进程写
            int wret = write(pipefd[1], "I am father\n", strlen("I am father"));
            if (wret == -1)
                perror("write");
            sleep(1);
        }
        close(pipefd[1]);
    }
    return 0;
}


// #include <iostream>
// #include <unistd.h> // 包含 pipe、fork、read、write 函数
// #include <cstdlib>
// #include <cstring>
// #include <sys/wait.h>

// using namespace std;

// int main() {
//     int fd[2]; // 存储管道读写端的文件描述符
//     pid_t pid;
//     char buf[256];

//     // 创建匿名管道
//     if (pipe(fd) < 0) {
//         cerr << "Failed to create pipe" << endl;
//         exit(1);
//     }

//     // 创建子进程
//     if ((pid = fork()) < 0) {
//         cerr << "Failed to fork" << endl;
//         exit(1);
//     } else if (pid > 0) { // 父进程
//         close(fd[0]); // 关闭管道读端
//         for (int i = 0; i < 5; i++) {
//             write(fd[1], "I am father\n", strlen("I am father\n")); // 向管道写入数据
//             sleep(1);
//         }
//         close(fd[1]); // 关闭管道写端
//         wait(NULL); // 等待子进程结束
//     } else { // 子进程
//         close(fd[1]); // 关闭管道写端
//         while (read(fd[0], buf, sizeof(buf)) > 0) { // 从管道读取数据
//             cout << buf; // 将读取到的数据打印到屏幕上
//             sleep(1);
//         }
//         close(fd[0]); // 关闭管道读端
//         exit(0);
//     }

//     return 0;
// }
